package special_class;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/9/21 21:21
 *      字符串常量池的理解
 *          1.采用直接赋值，类似于    String str = "字符串字面量";的方式创建对象，会使用字符串常量池：
 *             若该对象第一次使用，就在堆中开辟新空间，产生新对象，产生之后将该对象置入字符串的常量池
 *             当下次再次使用该对象时（还是采用直接赋值的方式），若常量池中已有该内容的字符串，直接引用常量池中的对象，不在创建字符串
 *
 *          1.1 "池化"思路 是程序设计的常用思路， 字符串常量池，数据库连接池，线程池...
 *          看到"池"：节省内存，提高效率
 *
 *          2. 字符串字面量 经常会被重复使用，放入常量池，当再次使用该内容，省去创建对象，开辟内存的时间，直接复用已有对象
 *
 *          String str=new String("hello");//代码背后的逻辑
 *              "hello" -->在字符串常量池
 *              new ---> 复制常量池中的"hello"，在堆中新开辟一块空间 放入该数据
 *
 *         3.字符串 的 intern()方法：
 *              调用intern方法，会将产生的字符串对象置入常量池（若不存在）
 *                  若已存在该对象，则返回常量池中的字符串引用
 *              为了避免歧义，每次调用intern后，接受一下返回值
 *
 *
 */
public class StringTheory {
    public static void main(String[] args) {
//        //同一个字符串对象
//        String str = "hello";
//        String str1 = "hello";
//        //两个字符串对象
//        String str2 = new String("hello");
//        String str3 = new String("hello") ;
//        System.out.println(str == str1);
//        System.out.println(str == str2);
//        System.out.println(str2 == str3);
//        char[] c = new char[] {'a','b','c'};
//        String s1 = new String(c);
//        String s2 = "abc";
//        System.out.println(s1==s2);//false
//        s1.intern();
//        System.out.println(s1==s2);//true

        String s1 = new String("abc");
        s1.intern();
        String s2 = "abc";
        System.out.println(s1==s2);//false



    }
}
